package com.example.demo.modules.study;

import com.example.demo.modules.study.entity.Person;
import org.junit.jupiter.api.Test;

import java.util.*;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.averagingInt;
import static java.util.stream.Collectors.partitioningBy;

public class StreamTest {

    public static void main(String[] args) {
        Map<String, Object> statisticsMap = getStatistics();
        List<Person> list1 = (List<Person>) statisticsMap.get("性别为男的集合");
        System.out.println(list1);
        Map<Boolean, List<Person>> map1 = (Map<Boolean, List<Person>>) statisticsMap.get("map的key值true为男，false为女的集合");
        for (Map.Entry<Boolean, List<Person>> entry : map1.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
        String s = (String) statisticsMap.get("所有名字组成一条语句");
        System.out.println(s);
    }

    @Test
    private static Map<String, Object> getStatistics(){
        Map<String, Object> resultMap = new HashMap<>();
        List<Person> list = new ArrayList<>();
        list.add(new Person("1", "测试", 0, 18));
        list.add(new Person("2", "开发", 1, 20));
        list.add(new Person("3", "运维", 1, 19));
        list.add(new Person("4", "DBA", 1, 22));
        list.add(new Person("5", "运营", 0, 24));
        list.add(new Person("6", "产品", 1, 21));
        list.add(new Person("7", "经理", 1, 25));
        list.add(new Person("8", "产品", 0, 21));

        //求性别为男的人集合
        List<Person> list1 = list.stream().filter(e -> e.getSex() == 0).collect(Collectors.toList());
        resultMap.put("性别为男的集合", list1);
        //map的key值true为男，false为女的集合
        Map<Boolean, List<Person>> map1 = list.stream().collect(partitioningBy(e -> e.getSex() == 0));
        resultMap.put("map的key值true为男，false为女的集合", map1);
        //求性别为男的人年龄总数
        int sum = list.stream().filter(e -> e.getSex() == 0).mapToInt(Person::getAge).sum();
        resultMap.put("性别为男的人年龄总数", sum);
        //按性别进行分组统计人数
        Map<Integer, Integer> map2 = list.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.summingInt(p -> 1)));
        resultMap.put("性别分组统计人数", map2);
        //判断是否有年龄大于25岁的人
        boolean check = list.stream().anyMatch(e -> e.getAge() > 25);
        resultMap.put("是否有大于25岁的人", check);
        //获取所有人姓名集合
        List<String> list2 = list.stream().map(Person::getName).collect(Collectors.toList());
        resultMap.put("所有人的姓名集合", list2);
        //求所有人的平均年龄
        Double avg = list.stream().collect(averagingInt(Person::getAge));
        resultMap.put("所有人的平均年龄", avg);
        //求年龄最大的人
        Person person1 = list.stream().reduce((e1, e2) -> {
            if (e1.getAge() > e2.getAge()) {
                return e1;
            } else {
                return e2;
            }
        }).get();
        resultMap.put("年龄最大的人1", person1);
        Person person2 = list.stream().max(Comparator.comparing(Person::getAge)).get();
        resultMap.put("年龄最大的人2", person2);
        //按照年龄从小到大排序
        List<Person> list3 = list.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
        resultMap.put("按照年龄从小到大排序", list3);
        //求年龄最小的两个人
        List<Person> list4 = list3.stream().limit(2).collect(Collectors.toList());
        resultMap.put("年龄最小的两个人", list4);
        //获取所有名字组成一条语句
        String s = list.stream().map(Person::getName).collect(Collectors.joining(",", "[", "]"));
        resultMap.put("所有名字组成一条语句", s);
        //获取年龄的最大值、最小值、平均值、求和等等
        IntSummaryStatistics intSummaryStatistics = list.stream().mapToInt(Person::getAge).summaryStatistics();
        resultMap.put("intSummaryStatistics", intSummaryStatistics);

        return resultMap;
    }

}
